#include "key.h"
uint8_t key_event = KEY_NONE;
void key_init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    SYSCTRL_AHBPeriphClk_Enable(SYSCTRL_AHB_PERIPH_GPIOA | SYSCTRL_AHB_PERIPH_GPIOB | SYSCTRL_AHB_PERIPH_GPIOC, ENABLE);

    PC13_AFx_GPIO();
    PB07_AFx_GPIO();
    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
    GPIO_InitStruct.Pins = KEY1_PIN;

    GPIO_Init(KEY1_PORT, &GPIO_InitStruct);
    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
    GPIO_InitStruct.Pins = KEY2_PIN;

    GPIO_Init(KEY2_PORT, &GPIO_InitStruct);
    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
    GPIO_InitStruct.Pins = KEY3_PIN;

    GPIO_Init(KEY3_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
    GPIO_InitStruct.Pins = KEY4_PIN;

    GPIO_Init(KEY4_PORT, &GPIO_InitStruct);
    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;
    GPIO_InitStruct.Pins = KEY5_PIN;

    GPIO_Init(KEY5_PORT, &GPIO_InitStruct);
}

#define LONG_CNT 40
uint16_t key_cnt[8] = {0};
void keyx_check(GPIO_PinState sta,uint8_t num,uint8_t *flag,uint8_t *result)
{
    if (sta == GPIO_Pin_RESET)
    {
        //按键按下
        *flag |= 1 << num;
        key_cnt[num]++;
    }
    else
    {
        if(*flag & (1 << num))
        {
            *flag &= ~(1 << num);
            if (key_cnt[num] < LONG_CNT)
            {
                *result = num + 1;
            }
            key_cnt[num] = 0;
        }
    }

    if (key_cnt[num] > LONG_CNT)
    {
        // *result = num + 9;
        *result = num + 1;
    }

}
/**
 * @brief 按键扫描 10ms一次
 * 
 * @return uint8_t 
 */
void key_scan(void)
{
    static uint8_t key_flag;
    static uint8_t old_key = 0;
    uint8_t ret = 0;

    keyx_check(GPIO_ReadPin(KEY1_PORT, KEY1_PIN), 0, &key_flag, &ret);
    keyx_check(GPIO_ReadPin(KEY2_PORT, KEY2_PIN), 1, &key_flag, &ret);
    keyx_check(GPIO_ReadPin(KEY3_PORT, KEY3_PIN), 2, &key_flag, &ret);
    keyx_check(GPIO_ReadPin(KEY4_PORT, KEY4_PIN), 3, &key_flag, &ret);
    keyx_check(GPIO_ReadPin(KEY5_PORT, KEY5_PIN), 4, &key_flag, &ret);

    if((old_key != ret) && (ret != KEY_NONE))
    {
        key_event = ret;
    }
    // else
    // {
    //     key_event = KEY_NONE;
    // }

    old_key = ret;
}
uint8_t  key_get_event(void)
{
    uint8_t ret= key_event;
    key_event = KEY_NONE;
    return ret;
}
